﻿/**
  NELMATE   ELMATEC   LM      EL  TECONELMA  CO         NE          MA   ONELMAT    ELMATECO  LMATECONE 
 ON        NE     CO  LMA     EL  TE         CO         NEL        LMA  CO      EC     AT     LM       
CO         NE     CO  LMAT    EL  TE         CO         NELM      ELMA  CO      EC     AT     LM
CO         NE     CO  LM TE   EL  TECONELM   CO         NE MA    NE MA  CONELMATEC     AT     LMATECONE
CO         KC     CO  LM  EC  EL  TE         CO         NE  AT  ON  MA  CO      EC     AT     LM
 ON        KC     CO  LM   CO EL  TE         CO         NE   TECO   MA  CO      EC     AT     LM
  NELMATE   ELMATEC   LM    ONEL  TECONELMA  CONELMATE  NE    EC    MA  CO      EC     AT     LMATECONE
_______________________________________________________________________________________________________
 ConelMate Framework 3.0 - copyright 2007(c) Ruben Sainz de la Maza
 
	@class: 	Connect
	@vertion: 	1.0
	@date:		25/02/08
				
	@language: 	ActionScript 3.0
	@author:	Ruben Sainz de la Maza
			
**/


//Esta clase permite crear un puente entre el codigo del servidor y el del cliente

package com.conelmate.nc
{
	
	import com.conelmate.util.Trace;
	import flash.net.NetConnection;
	

	public class ProxyClient extends Trace
	{
		
		static internal var	_INSTANCE	:ProxyClient;		//instancia de esta clase (singleton)			
				private var _refs		:Object;			//objeto donde se guardan las referencias de addClientListener
				private var _NC			:NetConnection;		//coneccion			


//_________________________________________________________________________________ Constructor
		public function ProxyClient(enforcer:SingletonEnforcer)
		{
			_isTrace = false;
			mTrace("#ProxyClient# constructor");
			
			_refs = new Object();
		}



//_________________________________________________________________________________ Public Methods

		/**
		 * singleton
		 * devolver una instancia de la clase
		 */	
		public static function getInstance():ProxyClient
		{
			if(ProxyClient._INSTANCE == null) ProxyClient._INSTANCE = new ProxyClient(new SingletonEnforcer());
			return ProxyClient._INSTANCE;
		}
		
		
		/**
		 * llamadas desde el server
		 */		
		public function clientCall():void 
		{
			mTrace("#ProxyClient# clientCall");
			var arr = arguments[0].func.split("/");
			_refs[arr[0]][arr[1]](arguments[0].arguments);
		}
		

		/**
		 * llamadas hacia el server
		 * @param   func 		:funcion o metodo que se va a invocar en el server
		 * @param   result 		:objeto que espera la respuesta
		 * @param   from 		:clase de referencia
		 * @param   arguments 	:parametros
		 */		
		public function serverCall(func:String, result = null, from = "", argument0 = null, argument1 = null, argument2 = null, argument3 = null):void 
		{
			mTrace("#ProxyClient# serverCall");
			mTrace(func+" "+ result+" "+ from+" "+ argument0+" "+ argument1+" "+ argument2+" "+ argument3)
			_NC.call(func, result, from, argument0, argument1, argument2, argument3);
		}


		/**
		 * suscribir una clase a las llamadas desde el server
		 * 
		 * @param   classReference 	:clase de referencia
		 * @param   className   	:nombre de la clase en string
		 */		
		public function addClientListener(classReference, className:String):void
		{
			mTrace("#ProxyClient# addClientListener " + className);
			_refs[className] = classReference;
		}
		

		/**
		 * desuscribir una clase a las llamadas desde el server
		 * 
		 * @param   classReference 	:clase de referencia
		 * @param   className   	:nombre de la clase en string
		 */		
		public function removeClientListener(className:String):void
		{
			mTrace("#ProxyClient# removeClientListener " + className);
			_refs[className] = null;
		}
//_________________________________________________________________________________ SETTERS

		public function set nc(p) { _NC = p; }
		
	}
}


internal class SingletonEnforcer{}

